package com.demo.java.OD251_300.OD286;
import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【信号发射和接收】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146080179
 */
public class OdMain {

    // 处理矩阵并计算每个元素的视野数量的函数
    public static String Solve_Method(int[][] anth, int m, int n) {
        int[][] ret = new int[m][n]; // 用来存储每个元素的视野数量

        // 竖直方向视野处理（处理每一列）
        for (int j = 0; j < n; j++) { // 遍历每一列
            for (int i = 0; i < m; i++) { // 遍历列中的每一行
                for (int k = i + 1; k < m; k++) { // 遍历行 i 到行 k 之间的元素
                    // 如果中间有比当前元素高的建筑物，跳过此行继续处理
                    if (k - i > 1 && anth[k][j] <= anth[k - 1][j]) {
                        continue; // 跳过中间被遮挡的元素
                    }
                    ret[k][j]++; // 当前元素视野可见数量增加
                    // 如果当前元素比起点元素高，则视野被阻挡，停止处理该列
                    if (anth[i][j] <= anth[k][j]) {
                        break; // 如果当前元素比前面的建筑物高，停止处理该列
                    }
                }
            }
        }

        StringBuilder sb = new StringBuilder(); // 创建StringBuilder用于拼接最终结果
        // 水平方向视野处理（处理每一行）
        for (int i = 0; i < m; i++) { // 遍历每一行
            for (int j = 0; j < n; j++) { // 遍历行中的每一列
                for (int k = j + 1; k < n; k++) { // 遍历列 j 到列 k 之间的元素
                    // 如果中间有比当前元素高的建筑物，跳过此列继续处理
                    if (k - j > 1 && anth[i][k] <= anth[i][k - 1]) {
                        continue; // 跳过被遮挡的元素
                    }
                    ret[i][k]++; // 当前元素视野可见数量增加
                    // 如果当前元素比起点元素高，则视野被阻挡，停止处理该行
                    if (anth[i][j] <= anth[i][k]) {
                        break; // 如果当前元素比前面的建筑物高，停止处理该行
                    }
                }
                sb.append(ret[i][j]).append(' '); // 将当前元素的视野数量加入结果字符串
            }
        }

        // 返回最终结果，包含矩阵的维度 m 和 n，后接每个元素的视野数量
        return m + " " + n + "\n" + sb.toString().trim(); // 最后返回视野矩阵的输出格式
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // 创建输入流对象
        int m = sc.nextInt(); // 输入矩阵的行数
        int n = sc.nextInt(); // 输入矩阵的列数
        int[][] anth = new int[m][n]; // 初始化矩阵

        // 输入矩阵中的每个元素
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                anth[i][j] = sc.nextInt(); // 输入矩阵每个位置的信号强度
            }
        }

        // 调用Solve_Method函数处理输入的矩阵，并输出结果
        System.out.println(Solve_Method(anth, m, n)); // 打印处理后的视野结果
    }
}